package cn.cai.controller;

import org.springframework.security.access.annotation.Secured;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class MySecurityController {

    /**
     * 必须包含“admin:write”或“guest:write”权限的登录用户才可以访问。
     *
     * PreAuthorize - 方法执行前，校验权限是否满足。  注解相当于access方法。
     *  属性 value - 字符串  提供access方法动态表达式。如：hasRole('ROLE_xxx')  hasAuthority('admin:write')
     * PostAuthorize - 方法执行结束后，校验权限是否满足。  很少使用。
     * @return
     */
    @RequestMapping("/all/write")
    @ResponseBody
    @PreAuthorize("hasAnyAuthority('admin:write','guest:write')")
    public String allWrite(){
        return "所有用户写操作";
    }

    /**
     * 必须拥有权限admin:write的登录用户，才可以访问。
     * @return
     */
    @RequestMapping("/admin/write")
    @ResponseBody
    @PreAuthorize("hasAuthority('admin:write')")
    public String adminWrite(){
        return "管理员写操作";
    }

    /**
     * 所有人都可访问
     * antMatchers("/all/read").hasAnyRole("访客","管理员");
     * 必须有'访客'或'管理员'角色才可以访问
     *
     * Secured注解：校验登录用户是否有需要的角色。
     *  属性：value：String[] 类型。相当于hasAnyRole
     *  注解不能自动拼接角色前缀
     * @return
     */
    @Secured({"ROLE_管理员","ROLE_访客"})
    @RequestMapping("/all/read")
    @ResponseBody
    public String allRead(){
        return "all:read";
    }

    /**
     * 只有管理员read权限的用户才可访问
     * @return
     */
    @RequestMapping("/admin/read")
    @ResponseBody
    @Secured("ROLE_管理员")
    public String adminRead(){

        return "admin:read";
    }


    @RequestMapping("/guest/read")
    @ResponseBody
    @Secured("ROLE_访客")
    public String guestRead(){
        return "guest:read";
    }




    @RequestMapping("/toLogin")
    public String toLogin(){
        return "login";
    }

    @RequestMapping("/toMain")
    public String toMain(){
        return "main";
    }

    @RequestMapping("/failure")
    public String failure(Model model){
        // 是否登录失败
        model.addAttribute("loginFail", "T");
        return "login";
    }
}
